package com.excilys.training.ebanking.web.java;

import java.util.List;

import org.excilys.training.ebanking.model.Compte;
import org.excilys.training.ebanking.model.Mois;
import org.excilys.training.ebanking.model.Operation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TransfertDataOperation {

	private List<Operation> operationsSansCarte;
	private List<Operation> operationsCarte;
	private boolean hasOperationsSansCarte;
	private boolean hasOperationsCarte;
	private int nombreOperationSansCarte;
	private int nombreOperationCarte;
	private double montantOperationsCarte;
	private List<Mois> listmois;
	private List<Integer> listannee;
	private Compte compte;
	private static Logger LOGGER = LoggerFactory
			.getLogger(TransfertDataOperation.class);

	/***************************************************************************************************************************************
	 * * GETTER & SETTER *
	 ***************************************************************************************************************************************/
	public List<Operation> getOperationsSansCarte() {
		return operationsSansCarte;
	}

	public void setOperationsSansCarte(List<Operation> operationsSansCarte) {
		setHasOperationsSansCarte(operationsSansCarte.isEmpty() ? false : true);
		this.operationsSansCarte = operationsSansCarte;
	}

	public List<Operation> getOperationsCarte() {
		return operationsCarte;
	}

	public void setOperationsCarte(List<Operation> operationsCarte) {
		setHasOperationsCarte(operationsCarte.isEmpty() ? false : true);
		this.operationsCarte = operationsCarte;
	}

	public boolean getHasOperationsSansCarte() {
		if (operationsSansCarte == null) {
			LOGGER.error("La liste d'operations sans carte doit été enregistrer avant de verifier si cette listeest vide");
		}
		return hasOperationsSansCarte;
	}

	public void setHasOperationsSansCarte(boolean hasOperationsSansCarte) {
		this.hasOperationsSansCarte = hasOperationsSansCarte;
	}

	public boolean getHasOperationsCarte() {
		if (operationsCarte == null) {
			LOGGER.error("La liste d'operations carte doit été enregistrer avant de verifier si cette listeest vide");
		}
		return hasOperationsCarte;
	}

	public void setHasOperationsCarte(boolean hasOperationsCarte) {

		this.hasOperationsCarte = hasOperationsCarte;
	}

	public int getNombreOperationSansCarte() {
		return nombreOperationSansCarte;
	}

	public void setNombreOperationSansCarte(int nombreOperationSansCarte) {
		this.nombreOperationSansCarte = nombreOperationSansCarte;
	}

	public int getNombreOperationCarte() {
		return nombreOperationCarte;
	}

	public void setNombreOperationCarte(int nombreOperationCarte) {
		this.nombreOperationCarte = nombreOperationCarte;
	}

	public double getMontantOperationsCarte() {
		return montantOperationsCarte;
	}

	public void setMontantOperationsCarte(double montantOperationsCarte) {

		this.montantOperationsCarte = montantOperationsCarte;
	}

	public List<Mois> getListmois() {
		return listmois;
	}

	public void setListmois(List<Mois> listmois) {
		this.listmois = listmois;
	}

	public List<Integer> getListannee() {
		return listannee;
	}

	public void setListannee(List<Integer> listannee) {
		this.listannee = listannee;
	}

	public Compte getCompte() {
		return compte;
	}

	public void setCompte(Compte compte) {
		this.compte = compte;
	}

	/*************************************************************************************************************************************
	 * METHODES *
	 *************************************************************************************************************************************/

	public int getNombrePageCarte(int nombreoperationbypage) {

		LOGGER.debug("nombre d operation carte :" + nombreOperationCarte);
		LOGGER.debug("nombre d operation par page" + nombreoperationbypage);

		if (nombreoperationbypage != 0 && getHasOperationsCarte()) {

			if (nombreOperationCarte % nombreoperationbypage != 0) {
				LOGGER.debug("nombre de page (carte) :"
						+ ((nombreOperationCarte / nombreoperationbypage) + 1));
				return (nombreOperationCarte / nombreoperationbypage) + 1;
			} else {
				LOGGER.debug("nombre de page (carte) :"
						+ ((nombreOperationCarte / nombreoperationbypage)));
				return nombreOperationCarte / nombreoperationbypage;
			}
		}
		LOGGER.warn("Le nombre d'opérations carte par page vaut 0 !!");
		return 0;
	}

	public int getNombrePage(int nombreoperationbypage) {

		LOGGER.debug("nombre d operation sans carte :"
				+ nombreOperationSansCarte);
		LOGGER.debug("nombre d operation par page" + nombreoperationbypage);



		if (nombreoperationbypage != 0 && getHasOperationsSansCarte()) {

			LOGGER.debug("nombre de page :"
					+ ((nombreOperationSansCarte / nombreoperationbypage) + 1));

			if (nombreOperationSansCarte % nombreoperationbypage != 0) {

				return (nombreOperationSansCarte / nombreoperationbypage) + 1;
			} else {
				LOGGER.debug("nombre de page :"
						+ ((nombreOperationSansCarte / nombreoperationbypage)));

				return nombreOperationSansCarte / nombreoperationbypage;
			}
		}

		LOGGER.warn("Le nombre d'opérations sans carte par page vaut 0 !!");

		return 0;
	}

	public static class Builder {

		TransfertDataOperation tdo;

		public Builder() {
			tdo = new TransfertDataOperation();
		}

		public Builder withCompte(Compte compte) {
			tdo.setCompte(compte);
			return this;
		}

		public Builder withListAnnee(List<Integer> listannee) {
			tdo.setListannee(listannee);
			return this;
		}

		public Builder withListMois(List<Mois> listmois) {
			tdo.setListmois(listmois);
			return this;
		}

		public Builder withMontantOperationsCarte(double montantOperationsCarte) {
			tdo.setMontantOperationsCarte(montantOperationsCarte);
			return this;
		}

		public Builder withNombreOperationSansCarte(int nombreOperationSansCarte) {
			tdo.setNombreOperationSansCarte(nombreOperationSansCarte);
			return this;
		}

		public Builder withNombreOperationCarte(int nombreOperationCarte) {
			tdo.setNombreOperationCarte(nombreOperationCarte);
			return this;
		}

		public Builder withOperationsCarte(List<Operation> operationsCarte) {
			tdo.setOperationsCarte(operationsCarte);
			return this;
		}

		public Builder withOperationsSansCarte(
				List<Operation> operationsSansCarte) {
			tdo.setOperationsSansCarte(operationsSansCarte);
			return this;
		}

		public TransfertDataOperation build() {
			return tdo;
		}

	}

}
